package com.cskaoyan.javase.array._6variable;

/**
 * 可变参数的使用:
 * 怎么使用可变参数？
 * 可变参数用于形参列表中，并且只能出现在形参列表的最后。
 *
 * 语法：
 * [修饰符列表] 返回值类型 方法名 (形式参数列表，数据类型... 变量名){
 *   //方法体
 * }
 * 其中"数据类型... 变量名"表示可变参数。
 * 按照上述语法定义的带有可变参数的方法，就允许在调用方法时，传入不同个数的对应数据类型实参。
 *
 * 可变参数的本质就是一个对应数据类型的数组,在调用可变参数方法时,允许传入数组作为实参,在方法内部处理可变参数也是当做数组去处理的.
 *
 * 当然普遍来说,可变参数的方法,在调用时,无需传入数组,只需要按照需求传入不确定个数的对应数据类型实参即可.
 *
 * 可变参数方法 vs 直接用数组作为形参的方法
 * 本质上是完全一样的
 * 区别在于:
 *      直接用数组作为形参的方法需要程序员在调用时,自己创建数组,然后将数组作为实参传递给方法
 *      而可变参数方法无需程序员自己创建数组,这个数组是底层编译器自己创建的,相当于节省了一步程序员自己创建数组对象的过程
 *
 *      这种实现原理不改变
 *      但是编译器/JVM等底层多做事，程序员少做事情，可以节省程序员精力(偷懒)的语法，我们统称为“语法糖”
 *
 *
 * @since 15:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println(sum(arr));
        // sum(1, 1, 3, 4, 5)
        System.out.println(sum(1, 2));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(1, 2, 3, 4));
        System.out.println(sum(1));
        // 不传参的话,相当于长度为0的数组
        System.out.println(sum());
    }

    // 需求: 求不确定个数的int数据之和。
    /*public statics int sum(int[] arr) {
        int result = 0;
        for (int ele : arr) {
            result += ele;
        }
        return result;
    }*/

    // 需求2: 求不确定个数的int数据之和,但是要求能够在调用方法时输入不确定个数的实参
    // 'sum(int...)' is already defined in 'com.cskaoyan.javase.array._6variable.Demo'
    public static int sum(int... arr) {
        int result = 0;
        for (int ele : arr) {
            result += ele;
        }
        return result;
    }

}
